package com.hmdp.utils;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

@Component   // 定义成spring的bean
public class RedisIdWorker {

    // 这个就是我们2022  1 1 0 0 的秒数
    // 开始时间戳
    private static final long BEGIN_TIMESTAMP = 1640995200L;
    // 移动位次
    private static final int count_bit = 32;


    @Resource
    private StringRedisTemplate stringRedisTemplate;

    //    keyPrefix 表示不同的业务
    public long nextId(String keyPrefix) {
        // 1.生成时间戳
        LocalDateTime now = LocalDateTime.now();
        // 现在的秒数
        long now1 = now.toEpochSecond(ZoneOffset.UTC);

        // 这个就是我们的时间戳
        long newSecond = now1 - BEGIN_TIMESTAMP;

        // 2.生成序列号
//        keyPrefix 表示不同的业务
        // 我们的关键字都要变化  所以后面添加一个日期字符串
        // 获取当前日期 精确到天
//          自定义一个
        String yyyyMMdd = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));

        // 这个是自增长
        Long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + yyyyMMdd);

        // 3.拼接并返回
        // 注意时间戳实在第一位的 那么我们就要使用位运算  因为我们返回的是long的类型

        // 或运算因为右边有32位0  有1则为1 全0才是0 所以这样我们的序列号就可以弄进去了
        return newSecond << count_bit | count;

    }


}
